今天聊聊到底這裡有效還是那裡有效(在幹嘛?)的作用域
當變數宣告的方式及位置不同時,都會影響到在操作或輸出時會產生不一樣的結果,作用域可說是宣告的變數其有效區域到哪裡,主要可分為全域及區域。
首先,位在文件的第一層稱作全域,像是文件一開頭就宣告的變數,就是全域的變數,全域變數的影響力是最大的,其他區域裡都能夠對它進行操作或產生其他運作。
而區域則是區塊內的變數,所謂的區塊就如if
、for
及while
語法中會使用到的大括號{}
裡面的內容,區域內的變數僅供區域使用,若想在區域外取用區域內的變數時,程式便會發出錯誤訊息,告知你這個變數沒有被定義。
let x = 5 // 全域變數
if (x === 5) {
let y = 8 // 區域變數
console.log(y) // 8
}
console.log(x) // 5
console.log(y) // 程式會回報錯誤 ReferenceError: y is not defined
其實在還沒有那麼熟悉前,有些觀念很容易搞混,關於作用域的觀念用一句話簡單理解的話,就是兒子(區域)可以拿爸爸(全域)的東西,可是爸爸不能拿兒子的東西(寫程式的時候可以邊寫邊想這句話)。
雖然幾天前有稍微提過var
、let
和const
,但隨著對作用域有更清楚的認識後,也能更了解為什麼不建議再使用var
來宣告變數,由於var
不受到區域的規則限制,又允許進行重複宣告,相對let
和const
是較為寬鬆的宣告方式,假如變數沒有明確的使用認知時,很容易讓程式碼背離預期的結果外,也會產生更多延伸的問題,所以還是建議以let
和const
為主來進行宣告變數。